/**
 * Tip提示库
 */

/*
 * 可选参数Options
	{
	//Tip容器宽度,默认为230
	'width'     : 230,
	//Tip容器高度,默认为自适应高度
	'height'    : 230,
	//Tip样式名称,如果不填写则将默认样式写入页面并使用默认样式
	'classname' : 'j_class_tip2',
	//Tip类型,目前支持有Center居中显示,Popup气泡显示
	'type'      : 'Center'
	}
 */

/**
 * Tip工厂实例
 * 
 * -factory(options) 获取Tip实例
 */
Pmoo.Tip2 = new function(){
	var self = this;
	
	var instances = {};
	
	/**
	 * 默认样式名称
	 */
	var _classname = 'j_class_tip2';
	
	/**
	 * 默认样式
	 */
	var _css = [
		'.',_classname,' {',
		'position:absolute;',
		'padding:5px;',
		'width:200px;',
		//'background:#FFFFCC none repeat scroll 0%;',
		//'border:1px solid #787779;',
		'background:#FFF6BF none repeat scroll 0%;',
		'border:1px solid #FFD324;',
		'color:#817134;',
		'text-align:left;',
		'z-index:11000;',
		'}',
		'.',_classname,' p {',
		'margin-top:10px;',
		'}'].join('');
	
	/**
	 * 样式已经初始化?
	 */	
	var _cssInited = false;
	
	/**
	 * 初始化统一的样式表
	 */
	function initCss(){
		if( ! _cssInited){
			//样式未初始化
			Pmoo.Utils.addCss(_css);
			_cssInited = true;
		}
	}
	
	/**
	 * 工厂方法,获取一个Tip实例
	 */
	this.factory = function(options){
		options = options ? options : {};
		if( ! options.classname){
			//未指定样式名称,使用默认样式
			initCss();
			options.classname = _classname;
		}
		var ins = new Pmoo.Tip2.TipClass(options);
		instances[ins.ID] = ins;
		return ins;
	};
	
	/**
	 * 关闭相应的tip
	 * @param {String} tid tipId
	 */
	this.close = function(tid){
		var ins = instances[tid];
		if(ins){
			ins.hide();	
		}
	};
};

/**
 * 实例自增id
 */
Pmoo.Tip2._pid = 1;

/**
 * Tip类
 * @param {Object} options 可选参数
 */
Pmoo.Tip2.TipClass = function(options){
	var self = this;
	
	/**
	 * 当前实例标识ID
	 */
	this.ID = '__' + (Pmoo.Tip2._pid++) + '__';
	
	/**
	 * 默认设置
	 */
	var settings = {
		/**
		 * Tip宽度
		 */
		'width' : 230,
		/**
		 * Tip类型 Center|Beside|Popup
		 */
		'type'  : 'Center'
	};
	
	$extend(settings, options);
	
	/**
	 * Tip Element
	 */
	var tip = null;
	
	/**
	 * 装饰者实例
	 */
	var decorator = null;
	
	function __init__(){
		var styles = {
			'display' : 'none',
			'width'	  : settings.width + 'px'
		};
		if(settings.height){
			//如果不设置高度的话div可以自适应高度
			if($type(settings.height) == 'number'){
				styles['height'] = settings.height + 'px';
			}
			else if($type(settings.height) == 'string'){
				styles['height'] = settings.height;
			}
		}	
		tip = new Element('div',{
			'class'  : settings.classname,
			'styles' : styles
		});
		var dectClass = Pmoo.Tip2.Decorators[settings.type];
		decorator = new dectClass(tip);
		if( ! document.body){
			//加上此处判断,可以在<body>标签之前初始化Tip
			document.write('<body></body>');
		}
		$(document.body).grab(tip,'top');
	}
	
	/**
	 * 设置tip内容
	 * @param {Object} c
	 */
	this.set = function(c){
		var pieces = $A(arguments)
		var html = pieces.join('');
		tip.html(html);
		return this;
	};
	
	/**
	 * 显示tip,所有参数将传递给修饰器
	 */
	this.show = function(){
		decorator.onShow.apply(decorator, arguments);
	};
	
	/**
	 * 隐藏tip,所有参数将传递给修饰器
	 */
	this.hide = function(){
		decorator.onHide.apply(decorator, arguments);
	};
	
	__init__();
};

/**
 * 装饰者
 */
Pmoo.Tip2.Decorators = {};

/**
 * 居中显示修饰器
 * @param {Object} el
 */
Pmoo.Tip2.Decorators.Center = function(el){
	var self = this;
	
	var tip = el;
	
	//位置定时器
	var posTimer = null;
	
	//隐藏定时器
	var hideTimer = null;
	
	/**
	 * 重新设置tip在页面上的位置
	 * 让tip保持居中
	 */
	function setPos(){
		Pmoo.log('重置tip位置');
		//页面大小
		var bodySize = $(document.body).getSize();
		//滚动大小
		var scrollSize = $(document.body).getScroll();
		//tip本身的大小
		var tipSize = tip.getCoordinates();
		var x = (bodySize.x - tipSize.width) / 2 + scrollSize.x;
		var y = (bodySize.y - tipSize.height) / 2 + scrollSize.y;
		tip.setStyle('left',x);
		tip.setStyle('top',y);
	}
	
	/**
	 * 清除所有定时器
	 */
	function clearAllTimer(){
		if(posTimer)posTimer.stop();
		if(hideTimer)hideTimer.stop();
		//clearInterval(posTimer);
		//clearTimeout(hideTimer);
	}
	
	/**
	 * onShow接口
	 * @param {Int} hideDelay 自动隐藏延时 时间ms 所果不设置此参数则不隐藏
	 */
	this.onShow = function(hideDelay){
		Pmoo.log('显示提示 自动隐藏延时',hideDelay,'ms');
		clearAllTimer();
		tip.show();
		setPos();
		posTimer = Pmoo.$interval(setPos, 500);
		if(hideDelay){
			hideTimer = Pmoo.$interval(function(){
				self.onHide();
			}, hideDelay,false);
		}
	};
	
	/**
	 * onHide接口
	 */
	this.onHide = function(){
		clearAllTimer();
		tip.hide();
	};
};

/**
 * 气泡显示修饰器
 * @param {Object} el
 */
Pmoo.Tip2.Decorators.Popup = function(el){
	var self = this;
	
	var tip = el;
	
	//显示效果参数
	var step = 20;
	
	//显示定时器
	var showTimer = null;
	
	//隐藏定时器
	var hideTimer = null;
	
	function clearAllTimer(){
		if(showTimer)showTimer.stop();
		if(hideTimer)hideTimer.stop();		
		//clearInterval(showTimer);
		//clearTimeout(hideTimer);
	}
	
	function initPos(){
		Pmoo.log('初始tip位置');
		var y = Pmoo.PageSize.getHeight();
		tip.setStyle('top',y);
		tip.show();
		var tipSize = tip.getCoordinates();
		tip.hide();
		var x = Pmoo.PageSize.getWidth() - tipSize.width - 5;
		tip.setStyle('left',x);
	}
	
	function setPos(hideDelay){
		Pmoo.log('设置tip位置');
		tip.show();
		var tipSize = tip.getCoordinates();
		var dis = 0;
		var delta = 10;
		var toGo = tipSize.height + delta;
		showTimer = Pmoo.$interval(function(){
			//Pmoo.log('显示效果');
			var ph = Pmoo.PageSize.getHeight();
			if(dis>=toGo){
				Pmoo.log('显示效果结束');
				showTimer.stop();
				showTimer = Pmoo.$interval(function(){
					//Pmoo.log('页面定位');
					var ph = Pmoo.PageSize.getHeight();
					tip.setStyle('top',ph-toGo);
				}, 500);
				if(hideDelay){
					hideTimer = Pmoo.$interval(function(){
						self.onHide();
					}, hideDelay,false);
				}
				return false;
			}			
			dis += step;
			dis = dis.limit(0, toGo);
			tip.setStyle('top',ph-dis);
		}, 20);
	}
	
	this.onShow = function(hideDelay){
		clearAllTimer();
		tip.hide();
		initPos();
		setPos(hideDelay);
	};
	
	this.onHide = function(){
		clearAllTimer();
		tip.hide();
	};
};

/**
 * beside修饰器,用于在element旁边显示tip
 */
/*
H1|V1---|V2-|V3----|V4-
  |--->cw<--|      | V  |  |
  |->tw<-   |      | th |  |
  |------->tw+cw<--| ^  |  |
H2|-----|---|------|--- V  |
  |     |   |      |    ch |
  |     |   |      |    ^  |
H3|-----|---|------|--- |  V
  |     |   |      |       ch+th
  |     |   |      |       ^
H4|-----|---|------|---    |
 */
Pmoo.Tip2.V1 = 0; //0000;
Pmoo.Tip2.V2 = 4; //0100;
Pmoo.Tip2.V3 = 8; //1000;
Pmoo.Tip2.V4 = 12;//1100;
Pmoo.Tip2.H1 = 0; //0000;
Pmoo.Tip2.H2 = 1; //0001;
Pmoo.Tip2.H3 = 2; //0010;
Pmoo.Tip2.H4 = 3; //0011;
Pmoo.Tip2.Decorators.Beside = function(el){
	var self = this;
	
	var tip = el;
	
	/**
	 * 默认参数
	 */
	var defaultOption = {
		//x方向偏移
		deltaX : 5,
		//y方向偏移
		deltaY : 5,
		//相对于element的坐标点
		planet : Pmoo.Tip2.V2|Pmoo.Tip2.H4,
		//隐藏延时
		hidelay : null
	};
	
	var hideTimer = null;
	
	function clearAllTimer(){
		Pmoo.$interval.clear(hideTimer);
	}
	
	function getTipSize(){
		tip.setStyles({
			'top'  : -9999,
			'left' : -9999
		});
		tip.show();
		var size = tip.getCoordinates();
		tip.hide();
		return size;
	}
	
	this.onShow = function(el, options){
		clearAllTimer();
		el = $(el);
		options = $merge(defaultOption, options);
		//根据坐标点的选定,计算相对于原点(element的左上角)的偏移值
		var tw  = options.planet & Pmoo.Tip2.V2;
		var cw  = options.planet & Pmoo.Tip2.V3;
		var th  = options.planet & Pmoo.Tip2.H2;
		var ch  = options.planet & Pmoo.Tip2.H3;
		var ts  = getTipSize();
		var es  = el.getCoordinates();
		var offsetX = 0;
		var offsetY = 0;
		offsetX += tw ? es.width : 0;
		offsetX += cw ? ts.width : 0;
		offsetY += th ? es.height : 0;
		offsetY += ch ? ts.height : 0;
		offsetX += options.deltaX;
		offsetY += options.deltaY;
		//计算原点在页面上的坐标
		var origin = {
			x : (es.left - ts.width),
			y : (es.top - ts.height)
		};
		var x = origin.x + offsetX;
		var y = origin.y + offsetY;
		var pageWidth = Pmoo.PageSize.getWidth();
		//防止tip超出页面范围
		x = x.limit(5, pageWidth - ts.width -5);
		tip.setStyles({
			'top'  : y,
			'left' : x
		});
		tip.show();
		if(options.hidelay){
			hideTimer = Pmoo.$interval(function(){
				self.onHide();
			},options.hidelay,false);
		}
	};
	
	this.onHide = function(){
		clearAllTimer();
		tip.hide();
	};		
};























